package com.monitor.service.report;

import com.monitor.model.ServerStatus;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 基于模板的报告生成器抽象类
 * 模板方法模式：定义报告生成的基本流程，具体的模板由子类提供
 */
public abstract class TemplateBasedReportGenerator implements ReportGenerator {
    protected static final Logger logger = LoggerFactory.getLogger(TemplateBasedReportGenerator.class);
    protected static Configuration freemarkerConfig;
    
    // 静态初始化Freemarker配置
    static {
        try {
            freemarkerConfig = new Configuration(Configuration.VERSION_2_3_31);
            
            // 设置模板加载路径，优先从外部目录加载，如果不存在则从classpath加载
            File templateDir = new File("templates");
            if (templateDir.exists() && templateDir.isDirectory()) {
                // 外部模板目录存在，使用外部模板
                freemarkerConfig.setDirectoryForTemplateLoading(templateDir);
                logger.info("使用外部模板目录: {}", templateDir.getAbsolutePath());
            } else {
                // 外部模板不存在，从classpath加载
                freemarkerConfig.setClassLoaderForTemplateLoading(
                    TemplateBasedReportGenerator.class.getClassLoader(), "templates");
                logger.info("使用内置模板");
            }
            
            // 配置Freemarker
            freemarkerConfig.setDefaultEncoding("UTF-8");
            freemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
            freemarkerConfig.setLogTemplateExceptions(false);
            freemarkerConfig.setWrapUncheckedExceptions(true);
            freemarkerConfig.setFallbackOnNullLoopVariable(false);
        } catch (Exception e) {
            logger.error("初始化Freemarker配置失败: {}", e.getMessage());
        }
    }
    
    /**
     * 实现报告生成的模板方法
     */
    @Override
    public boolean generateReport(List<ServerStatus> serverStatusList, String outputPath) {
        try {
            // 获取模板名称（由子类提供）
            String templateName = getTemplateName();
            
            // 获取模板
            Template template = freemarkerConfig.getTemplate(templateName);
            
            // 准备数据模型
            Map<String, Object> dataModel = createDataModel(serverStatusList);
            
            // 生成报告
            try (OutputStreamWriter writer = new OutputStreamWriter(
                    new FileOutputStream(outputPath), StandardCharsets.UTF_8)) {
                template.process(dataModel, writer);
            }
            
            logger.info("报告生成成功: {}", outputPath);
            return true;
        } catch (IOException | TemplateException e) {
            logger.error("生成报告失败: {}", e.getMessage());
            return false;
        }
    }
    
    /**
     * 获取模板名称
     * 由子类实现，返回具体的模板文件名
     * @return 模板文件名
     */
    protected abstract String getTemplateName();
    
    /**
     * 创建用于模板引擎的数据模型
     * 子类可以覆盖此方法提供额外的数据
     * @param serverStatusList 服务器状态列表
     * @return 数据模型映射
     */
    protected Map<String, Object> createDataModel(List<ServerStatus> serverStatusList) {
        Map<String, Object> dataModel = new HashMap<>();
        
        // 添加报告生成时间
        String currentTime = LocalDateTime.now()
            .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        dataModel.put("reportTime", currentTime);
        
        // 添加服务器列表
        dataModel.put("servers", serverStatusList);
        
        return dataModel;
    }
} 